package keer.httpinterface.annotation;

import keer.httpinterface.utils.AnnotationInfo;

import java.lang.reflect.Method;

/**
 * 注解配置类接口，用于处理对应的注解，将其转换成对应的配置
 * @since 2024-10
 * @author keer
 * @param <T> 通过注解配置生成的对象
 */
public interface AnnotationConfigure<T> {
    /**
     * 读取注解属性数据，转换成对应的配置对象
     * @param context 注解上下文
     * @param args 初始化参数
     * @return 根据注解属性值转换的配置类对象
     * @throws Exception 抛出所有异常
     */
    T configure(AnnotationContext context, Object[] args) throws Exception;

    /**
     * 注解上下文
     * @since 2024-10
     * @author xieyg
     */
    class AnnotationContext {
        /**
         * 目标类
         */
        private final Class<?> targetClass;
        /**
         * 目标方法
         */
        private final Method targetMethod;
        /**
         * 封装注解信息的实例
         * @see AnnotationInfo
         */
        private final AnnotationInfo annotation;
        /**
         * 代理实例
         */
        private final Object proxy;

        /**
         * 公共构造方法
         * @param targetClass 目标类Class
         * @param targetMethod 目标方法
         * @param annotation 注解信息，见{@link AnnotationInfo}
         * @param proxy 代理对象
         */
        public AnnotationContext(Class<?> targetClass,
                                 Method targetMethod,
                                 AnnotationInfo annotation,
                                 Object proxy) {
            this.targetClass = targetClass;
            this.targetMethod = targetMethod;
            this.annotation = annotation;
            this.proxy = proxy;
        }

        /**
         * 获取目标类Class
         * @return 目标类Class
         */
        public Class<?> getTargetClass() {
            return targetClass;
        }

        /**
         * 获取目标方法
         * @return 目标方法
         */
        public Method getTargetMethod() {
            return targetMethod;
        }

        /**
         * 获取注解信息
         * @return 注解信息,见{@link AnnotationInfo}
         */
        public AnnotationInfo getAnnotation() {
            return annotation;
        }

        /**
         * 获取代理实例
         * @return 代理实例
         */
        public Object getProxy() {
            return proxy;
        }
    }
}
